/**
 * 封装诊疗记录 Mock 数据
 */
const getRecordMockData = (recordId, patientId) => {
    // 假设当前登录的医生名
    const DEFAULT_DOCTOR = '王医生 (登录账号)';

    // **患者信息列表 - 扩展Mock数据**
    const patientList = {
        'P00123': { id: 'P00123', patientName: '李思涵', gender: '女', age: 25 },
        'P00456': { id: 'P00456', patientName: '张建国', gender: '男', age: 38 },
        'P00789': { id: 'P00789', patientName: '王小明', gender: '男', age: 12 },
        'P00101': { id: 'P00101', patientName: '赵丽娟', gender: '女', age: 45 },
        'P00202': { id: 'P00202', patientName: '周大为', gender: '男', age: 60 },
    };

    let baseData = {
        recordId: null,
        patientId: patientId || null,
        patientName: '',
        gender: '',
        age: '',
        isEdit: false,
        isDraft: false,

        project: '',
        date: new Date().toISOString().split('T')[0],
        doctor: DEFAULT_DOCTOR, // **默认登录医生名**
        fee: '',

        diagnosis: '',
        content: '',

        // 模拟数据也采用新图在前的方式排列 (新图为 rec4, rec3...)
        images: [],
        advice: '',
        // 新增：完整的患者列表，用于模态框搜索
        allPatientList: Object.values(patientList), 
    };

    if (patientId && patientList[patientId]) {
        Object.assign(baseData, patientList[patientId]);
    }

    if (recordId) {
        // 编辑模式/草稿数据 (会覆盖基础信息，并填充患者信息)
        Object.assign(baseData, {
            recordId: recordId,
            patientId: 'P00123',
            ...patientList['P00123'],
            isEdit: true,
            isDraft: recordId === 'DRAFT001',
            project: '隐适美复诊 (15/40)',
            date: '2025-11-20',
            fee: '120.00',
            diagnosis: '矫治进度正常，上颌 1/4 牙套佩戴时间需增加。',
            content: `本次更换了新的牙套序列（15/40），\n检查了附件粘接情况，发现右下 6 号附件脱落，已重新粘接。`,
            // Mock数据也按照新图在前的方式排列
            images: [
                'https://picsum.photos/seed/rec4/210/210', // 最新
                'https://picsum.photos/seed/rec3/210/210',
                'https://picsum.photos/seed/rec2/210/210',
                'https://picsum.photos/seed/rec1/210/210', // 最旧
            ],
            advice: '1. 保持每天佩戴时间大于 22 小时；2. 下次复诊时间定于 2025-12-26。',
        });
    }

    return baseData;
};

/**
 * 防抖函数：防止短时间内重复触发同一事件
 * @param {Function} func - 要执行的函数
 * @param {number} delay - 延迟时间（毫秒）
 * @returns {Function} 防抖后的函数
 */
const debounce = (func, delay) => {
    let timer = null;
    return function(...args) {
        // 清除之前的定时器
        if (timer) clearTimeout(timer);
        // 创建新的定时器
        timer = setTimeout(() => {
            func.apply(this, args);
            timer = null; // 执行后清空定时器
        }, delay);
    };
};

Page({
    data: {
        formData: {},
        isEdit: false,
        isDraft: false,
        isSaving: false,
        
        // **新增：患者选择模态框状态**
        showModal: false,
        searchKeyword: '',
        filteredPatientList: [], // 搜索/展示的患者列表
    },

    onLoad(options) {
        const recordId = options.recordId;
        const patientId = options.patientId;
        const isEdit = !!recordId;

        const data = getRecordMockData(recordId, patientId);

        this.setData({
            formData: data,
            isEdit: isEdit,
            isDraft: data.isDraft || false,
            // 默认情况下，展示所有患者
            filteredPatientList: data.allPatientList, 
        });

        wx.setNavigationBarTitle({
            title: isEdit ? '编辑诊疗记录' : '新建诊疗记录'
        });
    },

    // **新增：模态框展示/隐藏逻辑**
    showPatientModal() {
        this.setData({ 
            showModal: true,
            searchKeyword: '', // 每次打开重置搜索关键词
            // 每次打开重置列表为全部患者
            filteredPatientList: this.data.formData.allPatientList 
        });
    },
    
    hidePatientModal() {
        this.setData({ showModal: false });
    },
    
    // **新增：处理患者搜索输入**
    handleSearchInput: debounce(function(e) {
        const keyword = e.detail.value.trim();
        this.setData({ searchKeyword: keyword });
        this.filterPatientList(keyword);
    }, 300), // 300ms 防抖，避免频繁搜索

    // **新增：根据关键词过滤患者列表**
    filterPatientList(keyword) {
        const allPatients = this.data.formData.allPatientList;
        if (!keyword) {
            this.setData({ filteredPatientList: allPatients });
            return;
        }

        const filteredList = allPatients.filter(patient => 
            patient.patientName.includes(keyword)
        );
        
        this.setData({ filteredPatientList: filteredList });
    },
    
    // **新增：确认患者选择**
    confirmPatientSelection(e) {
        const patient = e.currentTarget.dataset.patient;
        
        this.setData({
            'formData.patientId': patient.id,
            'formData.patientName': patient.patientName,
            'formData.gender': patient.gender,
            'formData.age': patient.age,
        });
        
        this.hidePatientModal(); // 关闭模态框
        wx.showToast({ title: `已选择患者: ${patient.patientName}`, icon: 'none' });
    },

    // **新增：跳转到患者登记页面**
    navigateToPatientRegistration() {
        this.hidePatientModal(); // 先关闭当前模态框
        wx.showModal({
            title: '提示',
            content: '您将被引导至患者登记页面，登记成功后请返回选择该患者。',
            success: (res) => {
                if (res.confirm) {
                    wx.navigateTo({
                        url: '/pages/patient-registration/patient-registration?source=record'
                    });
                }
            }
        });
    },
    
    /**
     * **原有的 selectPatient 方法改为 showPatientModal 触发模态框，
     * 但保留 selectPatient 的事件通道逻辑，以防其他页面调用。
     * 在 WXML 中，已将 bindtap="selectPatient" 替换为 bindtap="showPatientModal"。**
     */
    selectPatient() {
        // 保留原有的导航逻辑作为备用，但现在主要通过模态框进行选择
        wx.navigateTo({
            url: '/pages/doctor/patient-list/patient-list',
            success: (res) => {
                // 监听患者选择页面的回调
                res.eventChannel.on('acceptPatientSelection', (data) => {
                    if (data && data.patientId) {
                        // 接收到选中的患者信息
                        this.setData({
                            'formData.patientId': data.patientId,
                            'formData.patientName': data.patientName,
                            'formData.gender': data.gender,
                            'formData.age': data.age,
                        });
                        wx.showToast({ title: `已选择患者: ${data.patientName}`, icon: 'none' });
                    } else if (data && data.action === 'gotoRegister') {
                        // 接收到跳转到登记页面的指令
                        this.navigateToPatientRegistration();
                    }
                });
            }
        });
    },

    /**
     * 通用输入框和文本域处理
     */
    handleInput(e) {
        const { field } = e.currentTarget.dataset;
        const value = e.detail.value;
        this.setData({ [`formData.${field}`]: value });
    },

    /**
     * Picker 选择器处理
     */
    handlePickerChange(e) {
        const { field } = e.currentTarget.dataset;
        this.setData({ [`formData.${field}`]: e.detail.value });
    },

    /**
     * 影像上传 - 核心改动：新图在前 (unshift)
     */
    chooseImage() {
        wx.chooseMedia({
            count: 9 - this.data.formData.images.length, // 还能上传的数量
            mediaType: ['image'],
            sourceType: ['album', 'camera'],
            success: (res) => {
                const tempFilePaths = res.tempFiles.map(file => file.tempFilePath);

                let newImages = [...this.data.formData.images];
                // 使用 unshift 将新上传的图片添加到数组头部 (实现新图在前)
                newImages.unshift(...tempFilePaths);

                this.setData({ 'formData.images': newImages });
                wx.showToast({ title: `成功上传 ${tempFilePaths.length} 张图片`, icon: 'none' });
            }
        });
    },

    /**
     * 删除影像
     */
    deleteImage(e) {
        const index = e.currentTarget.dataset.index;
        let images = [...this.data.formData.images];
        images.splice(index, 1);
        this.setData({ 'formData.images': images });
        wx.showToast({ title: '图片已删除', icon: 'none' });
    },

    /**
     * 预览影像
     */
    previewImage(e) {
        const current = e.currentTarget.dataset.src;
        wx.previewImage({
            current: current,
            urls: this.data.formData.images
        });
    },

    /**
     * 表单校验
     */
    validateForm() {
        const { patientId, project, date, diagnosis, content } = this.data.formData;
        if (!patientId) {
            wx.showToast({ title: '请先选择患者', icon: 'error' });
            return false;
        }
        if (!project || !date || !diagnosis || !content) {
            wx.showToast({
                title: '请填写所有必填项 (项目、日期、诊断、过程)',
                icon: 'error',
                duration: 2500
            });
            return false;
        }
        return true;
    },

    /**
     * 保存为草稿（防抖处理）
     */
    saveAsDraft: debounce(function() {
        // 若正在提交/保存，直接返回
        if (this.data.isSaving) return;

        // 开始保存，禁用按钮
        this.setData({ isSaving: true });
        console.log('保存草稿数据:', this.data.formData);

        // 模拟保存接口请求（1秒后完成）
        setTimeout(() => {
            this.setData({ isSaving: false, isDraft: true });
            wx.showToast({ title: '草稿保存成功', icon: 'success' });
        }, 1000);
    }, 500), // 500毫秒防抖延迟，可根据需求调整

    /**
     * 完成并提交（防抖处理）
     */
    submitRecord: debounce(function() {
        // 若正在提交/保存，直接返回
        if (this.data.isSaving) return;

        // 表单校验
        if (!this.validateForm()) return;

        // 开始提交，禁用按钮
        this.setData({ isSaving: true });
        console.log('正式提交数据:', this.data.formData);

        // 模拟提交接口请求（1.5秒后完成）
        setTimeout(() => {
            this.setData({ isSaving: false });
            wx.showToast({ title: '诊疗记录提交成功', icon: 'success' });
            wx.navigateBack({ delta: 1 });
        }, 1500);
    }, 500), // 500毫秒防抖延迟，可根据需求调整

    // 页面卸载时清除防抖定时器，防止内存泄漏
    onUnload() {
        // 清除所有可能存在的防抖定时器
        const debouncedFuncs = [this.saveAsDraft, this.submitRecord, this.handleSearchInput]; // 增加搜索防抖
        debouncedFuncs.forEach(func => {
            if (func && func.timer) clearTimeout(func.timer);
        });
    }
});